package cn.edu.zzu.demo03ThreadSecurity;

/**
 * 死锁：
 * 产生原因：线程之间获取对方持有且不释放的资源
 */
public class TestDeadLock {
    public static void main(String[] args) {
        new MakeUp("灰姑娘", 0).start();
        new MakeUp("白雪公主", 1).start();
    }
}


class LipStick {
    //口红
}

class Mirror {
    //镜子
}

/**
 * 化妆
 */
class MakeUp extends Thread {
    private String name;
    private Integer choose;

    public MakeUp(String name, Integer choose) {
        super(name);
        this.name = name;
        this.choose = choose;
    }


    @Override
    public void run() {
        try {
            makeup();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //确保唯一 static
    static LipStick lipStick = new LipStick();
    static Mirror mirror = new Mirror();

    /**
     * 解决该死锁办法，两个同步锁 不要嵌套， 当一个线程使用该锁后，释放，另一个线程在去获取，就可以拿到资源，死锁就不会产生
     * @throws InterruptedException
     */
    public void makeup() throws InterruptedException {
        if (choose == 0) {
            //想要镜子
            synchronized (lipStick) {
                System.out.println(Thread.currentThread().getName() + "拿到了镜子的锁");
                Thread.sleep(1000);
                //想要口红  //改进：不要嵌套
                synchronized (mirror) {
                    System.out.println(Thread.currentThread().getName() + "拿到了口红的锁");
                }
            }
        }else{
            //想要口红
            synchronized (mirror) {
                System.out.println(Thread.currentThread().getName() + "拿到了口红的锁");
                Thread.sleep(2000);
                //想要镜子  //改进：不要嵌套
                synchronized (lipStick) {
                    System.out.println(Thread.currentThread().getName() + "拿到了镜子的锁");

                }
            }
        }
    }
}